/**
 * @file data_point.h
 * @brief 数据点类定义 - 支持Telegraf Line Protocol格式
 */

#ifndef KWDB_DATA_POINT_H
#define KWDB_DATA_POINT_H

#include <string>
#include <map>
#include <chrono>
#include <memory>

namespace kwdb {

/**
 * @brief 数据点类，支持Telegraf Line Protocol格式
 */
class DataPoint {
public:
    /**
     * @brief 构造函数
     * @param measurement 测量名称
     */
    explicit DataPoint(const std::string& measurement);
    
    /**
     * @brief 构造函数
     * @param measurement 测量名称
     * @param timestamp 时间戳（毫秒）
     */
    DataPoint(const std::string& measurement, int64_t timestamp);
    
    /**
     * @brief 添加标签
     * @param key 标签键
     * @param value 标签值
     * @return DataPoint引用（支持链式调用）
     */
    DataPoint& addTag(const std::string& key, const std::string& value);
    
    /**
     * @brief 添加字段 - 字符串类型
     * @param key 字段键
     * @param value 字段值
     * @return DataPoint引用（支持链式调用）
     */
    DataPoint& addField(const std::string& key, const std::string& value);
    
    /**
     * @brief 添加字段 - 整数类型
     * @param key 字段键
     * @param value 字段值
     * @return DataPoint引用（支持链式调用）
     */
    DataPoint& addField(const std::string& key, int64_t value);
    
    /**
     * @brief 添加字段 - 双精度浮点类型
     * @param key 字段键
     * @param value 字段值
     * @return DataPoint引用（支持链式调用）
     */
    DataPoint& addField(const std::string& key, double value);
    
    /**
     * @brief 添加字段 - 布尔类型
     * @param key 字段键
     * @param value 字段值
     * @return DataPoint引用（支持链式调用）
     */
    DataPoint& addField(const std::string& key, bool value);
    
    /**
     * @brief 设置时间戳
     * @param timestamp 时间戳（毫秒）
     * @return DataPoint引用（支持链式调用）
     */
    DataPoint& setTimestamp(int64_t timestamp);
    
    /**
     * @brief 转换为Line Protocol格式
     * @return Line Protocol字符串
     */
    std::string toLineProtocol() const;
    
    // Getters
    const std::string& getMeasurement() const { return measurement_; }
    const std::map<std::string, std::string>& getTags() const { return tags_; }
    const std::map<std::string, std::string>& getFields() const { return fields_; }
    int64_t getTimestamp() const { return timestamp_; }

private:
    std::string measurement_;
    std::map<std::string, std::string> tags_;
    std::map<std::string, std::string> fields_;
    int64_t timestamp_;
    
    /**
     * @brief 转义字符串
     * @param str 原始字符串
     * @return 转义后的字符串
     */
    std::string escapeString(const std::string& str) const;
};

/**
 * @brief 数据点智能指针类型
 */
using DataPointPtr = std::shared_ptr<DataPoint>;

} // namespace kwdb

#endif // KWDB_DATA_POINT_H
